﻿using FileToVideo.Interface;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace FileToVideo.AddFunc
{
    /// <summary>
    /// IFrameData接口扩展方法
    /// </summary>
    public static class IFrameDataAdd
    {
        /// <summary>
        /// 将IFrameData对象转换为字典
        /// </summary>
        /// <param name="frameData"></param>
        /// <returns></returns>
        public static Dictionary<string, string> ToDict<T>(this T frameData) where T : IFrameData
        {
            if (frameData == null)
                throw new ArgumentNullException(nameof(frameData));

            var dict = new Dictionary<string, string>();

            // 获取类型信息
            var type = typeof(T);

            // 添加帧ID
            dict.Add("frame_id", frameData.frame_id.ToString());

            // 添加版本信息
            dict.Add("version", IFrameData.Version);

            // 添加数据内容
            dict.Add("data", frameData.data ?? string.Empty);

            // 可选：添加其他公共属性（如果需要的话）
            // 获取所有公共实例属性（除了接口中已明确定义的）
            var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                                .Where(p => p.Name != "frame_id" &&
                                           p.Name != "data" &&
                                           p.Name != "Version" &&
                                           p.CanRead);

            foreach (var property in properties)
            {
                try
                {
                    var value = property.GetValue(frameData);
                    dict.Add(property.Name.ToLower(), value?.ToString() ?? string.Empty);
                }
                catch (Exception ex)
                {
                    // 如果某个属性读取失败，可以记录日志或忽略
                    // 这里我们将其值设为错误信息，或者可以选择跳过
                    dict.Add(property.Name.ToLower(), $"Error: {ex.Message}");
                }
            }

            return dict;
        }

        /// <summary>
        /// 将数据转为存储用字符串
        /// <br />
        /// 深度序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string ToDeepSave<T>(this T data) where T : IFrameData
        {
            var setting = new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All, // 保留类型值信息
            };

            return JsonConvert.SerializeObject(data, setting);
        }

        /// <summary>
        /// 将数据转为存储用字符串
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string ToSave<T>(this T data) where T : IFrameData
        {
            return System.Text.Json.JsonSerializer.Serialize<T>(data);
        }
    }
}
